const util = require('./utils/util.js')
// const regeneratorRuntime = require('./utils/regenerator-runtime.js')
let db = null

App({
  globalData: {
    userInfo: null,
    openId: '',
    userId: '',
    orderCache: [] // 缓存一下生成订单的商品数据
  },

  config: {
    env: 'guozhiquan' // 'test'
  },

  onLaunch: function () {
    
    if (!wx.cloud) {
      console.error('请使用 2.2.3 或以上的基础库以使用云能力')
    } else {
      wx.cloud.init({
        // env 参数说明：
        //   env 参数决定接下来小程序发起的云开发调用（wx.cloud.xxx）会默认请求到哪个云环境的资源
        //   此处请填入环境 ID, 环境 ID 可打开云控制台查看
        //   如不填则使用默认环境（第一个创建的环境）
        // env: 'my-env-id',
        traceUser: true,
      })
    }

    this.globalData = {}

    db = this.globalData.db = wx.cloud.database()
  },

  appUser: null,

  success(title, duration, mask) {
    wx.showToast(util.filterEmptyValue({
      title, duration, mask
    }))
  },

  fail(title, duration, mask) {
    title += ''
    wx.showToast(util.filterEmptyValue({
      title, duration, mask,
      icon: 'none'
    }))
  },

  // 获取用户openid
  async getOpenId() {
    if (this.globalData.openId) {
      return this.globalData.openId
    }

    const loginRes = await wx.cloud.callFunction({
      name: 'login' + (this.config.env === 'test' ? '-test' : '')
    }).catch(res => {
      return undefined
    })

    this.globalData.openId = loginRes.result.openid
    return this.globalData.openId
  },

  async loginLogic(that) { // 登录逻辑
    const res = await this.checkUserExisted()
    if (res === 1) { // 用户存在数据库
      that.setData({ userInfoFlag: 1 })
      return 1
    }

    if (res === 3) { // 用户不存在，获取信息并插入数据库
      const flag = await this.checkGetUserInfo()
      that.setData({ userInfoFlag: flag })
      switch (flag) {
        case 1:
          const { userInfo } = await this.wxGetUserInfo()
          this.globalData.userInfo = userInfo
          const userAddRes = await db.collection('users').add({
            data: {
              userInfo,
              carts: [], // 购物车
              registerTime: db.serverDate(),
              lastLoginTime: db.serverDate()
            }
          }).catch(err => {
            this.fail('登录失败')
            return 2
          })

          this.globalData.userId = userAddRes._id
          // this.success('登录成功')
          return 1
          break;
        case 2: // 需要获取用户信息按钮
          return 2
          break;
        case 3: // 需要打开设置按钮
          return 3
          break;
      }
    }
  },

  async getUserInfo(e, that) { // 点击获取用户信息，在组件get-user-info里使用
    if (e.detail.userInfo) { // 允许获取用户信息
      let userInfo = e.detail.userInfo
      this.globalData.userInfo = userInfo
      let { _id } = await db.collection('users').add({
        data: {
          userInfo,
          carts: [], // 购物车
          registerTime: db.serverDate(),
          lastLoginTime: db.serverDate()
        }
      }).catch(err => {
        that.setData({ userInfoFlag: 1 })
        this.fail('登录失败')
        return 2
      })

      this.globalData.userId = _id
      that.setData({ userInfoFlag: 1 })
      // this.success('登录成功')
      return 1

    } else { // 拒绝获取用户信息
      that.setData({ userInfoFlag: 3 })
      return undefined
    }
  },

  async checkUserExisted() { // 检查用户是否存在
    const openId = await this.getOpenId()
    if (!openId) { // 一般不会出现
      this.fail('获取openId失败')
      return undefined
    }

    if (this.globalData.userId) { // 全局存在userId
      return 1
    }

    const userRes = await db.collection('users').where({ _openid: openId }).get() // 全局不存在，去查数据库获取用户信息
    if (userRes.data.length) {
      let userData = userRes.data[0]
      let _id = userData._id
      this.globalData.userId = _id
      this.globalData.isAdmin = !!userData.isAdmin
      this.globalData.userInfo = userData.userInfo

      const { userInfo } = await this.wxGetUserInfo()
      if (userInfo) { // 为了获取最新的用户头像昵称信息。如果拿到用户信息
        this.globalData.userInfo = userInfo
        db.collection('users').doc(_id).update({
          data: {
            userInfo,
            lastLoginTime: db.serverDate()
          }
        })
      } else { // 更新登录时间
        db.collection('users').doc(_id).update({
          data: {
            lastLoginTime: db.serverDate()
          }
        })
      }
      return 1
    }

    return 3 // 用户不存在，需要插入数据库
  },

  checkGetUserInfo() { // 检查用户信息获取情况，显示获取按钮还是打开设置按钮
    return new Promise((resolve, reject) => {
      wx.getSetting({
        success: res => {
          let userInfoAuthExist = Object.keys(res.authSetting).includes('scope.userInfo')
          let userInfoAuthed = res.authSetting['scope.userInfo']

          if (userInfoAuthed) { // 用户信息已授权，可以直接使用wx.getUserInfo
            return resolve(1)
          }

          if (userInfoAuthExist) { // 需要打开设置按钮
            return resolve(3)
          }

          resolve(2) // 需要获取用户信息按钮
        },
        fail: res => {
          resolve(2)
        }
      })
    })
  },

  wxGetUserInfo() { // 将原生的wx.getUserInfo改为promise
    return new Promise((resolve, reject) => {
      wx.getUserInfo({
        lang: 'zh_CN',
        complete: res => resolve(res)
      })
    })
  }
})
